package com;

import com.config.ApplicationContextInitializerTest;
import com.config.DeferredImportSelectorTest;
import com.config.TypeExcludeFilterText;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.annotation.Import;

import java.util.HashMap;
import java.util.Map;

/**
 * @author chengyadong
 * @date 2022/4/18 19:08
 * @description
 */
// Same as @SpringBootConfiguration @EnableAutoConfiguration @ComponentScan
//exclude,excludeName可以指定自动装配时排除哪些类
@SpringBootApplication
@Import(DeferredImportSelectorTest.class)
public class MyTestApplication {
	//当启动SpringBoot应用程序的时候会先创建SpringApplication对象,在对象的构造方法中进行参数的初始化工作,最主要的是判断当前应用程序的类型以及初始化器和监听器,
	// 在此过程中会加载整个应用程序中的spring.factories文件,将文件的内容放在缓存对象中,方便后续获取
	//而main方法中的args代表外部传入的参数，比如java -jar xxx.jar hello java 那么此时args为['hello','java']
	public static void main(String[] args) {
        //分成了两部分，1：构造SpringApplication初始化一些基础信息 2：执行run方法  （主配置类和启动类可以是两个，为了简化方便一般都是定义成一个）
		SpringApplication.run(MyTestApplication.class,args);

		/*//跟上面的启动方式等价
		SpringApplication application = new SpringApplication(MyTestApplication.class);
		//可以通过该方式来设置我们defaultProperties 不过其优先级最低
		Map t = new HashMap();
		//key的话按照在yaml中的层级进行配置
		t.put("server.port","8082");

		//应用程序启动过程中通过系统属性或命令行参数来设置on-not-found、name属性才会生效，在application.yaml中配置无效，因为其解析是在application.yaml解析之前进行
		//on-not-found属性，配置文件找不到时如何处理，默认值为false,如果找不到终止程序  ignore找不到忽略 程序继续运行
		t.put("spring.config.on-not-found","ignore");
		//默认配置文件名称，默认为application
		t.put("spring.config.name","defrost");

		//下面的三个属性中指定的配置文件如果不存在时默认情况下程序会报错 我们可以通过设置spring.config.on-not-found属性为ignore来进行忽略使程序正常运行
		//也可以针对不存在的文件前面加上optional:前缀，表示该配置文件可有可无，存在就解析不存在也不影响运行

		//这个属性用于导入其他配置文件并与主配置文件合并。可以使用逗号分隔多个配置文件路径，并且路径可以是绝对路径或相对路径。  注意这三个属性如果value值用逗号隔开那么会按逗号
		//创建相应的贡献者  如果是；号那么只会生成一个贡献者，在解析该贡献者的时候会根据；进行切分生成多个路径信息
		t.put("spring.config.import","optional:classpath:config/application-common.properties;optional:file:/opt/config/application-production.properties");
		//这个属性用于指定额外的配置文件位置，它与主配置文件进行合并
		t.put("spring.config.additional-location","optional:file:/etc/myapp/");
		//这个属性用于指定配置文件的位置，它将完全覆盖默认的配置文件位置，包括类路径下的 application.properties 或 application.yml。
		t.put("spring.config.location","classpath:custom-config.properties,file:/opt/config/myapp.yml");

		application.setDefaultProperties(t);
		//通过该配置会去解析application-text.yaml(yml、properties)对应的配置文件 其作用和spring.profile.active作用一样，只不过该方式
		//是通过代码来设置的，侵入性更强一些
		application.setAdditionalProfiles("test");
		//应用程序方式添加容器初始化器
		application.addInitializers(new ApplicationContextInitializerTest());
		//获取到容器对象
		ConfigurableApplicationContext context = application.run(args);
		context.getBean("myTestApplication");*/
	}

}